package com.erp.erp_ui.TaskInfo.service;

import com.erp.enums.OperationStatusEnum;
import com.erp.erp_entitys.TaskInfo.entity.TaskInfo;
import com.erp.erp_entitys.TaskInfo.entity.TaskProductInfo;
import com.erp.erp_servers.TaskInfo.TaskInfoService;
import com.erp.erp_servers.TaskInfo.TaskProductInfoService;
import com.erp.erp_ui.TaskInfo.req.AddNewupTaskReq;
import com.erp.erp_ui.TaskInfo.req.AddProductionReq;
import com.erp.utils.R;
import com.erp.utils.ResultStatusEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @ClassName : NewUpTaskService
 * @Description : 任务业务逻辑层
 * @Author : xq
 * @Date: 2020-12-28 16:08
 */
@Service
public class NewUpTaskService {
    /**
     * 日志
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(NewUpTaskService.class);

    /**
     * 任务接口
     */
    private final TaskInfoService taskInfoService;

    /**
     * 任务明细接口
     */
    private final TaskProductInfoService taskProductInfoService;


    @Autowired
    public NewUpTaskService(TaskInfoService taskInfoService,TaskProductInfoService taskProductInfoService) {
        this.taskInfoService = taskInfoService;
        this.taskProductInfoService = taskProductInfoService;
    }

    /**
     * 出口业务-任务-新增、修改
     * @param req 新增、修改参数实体
     * @param creator 创建人
     * @param createNo 创建人编码
     * @return 新增、修改结果
     */
    @Transactional(rollbackFor = Exception.class)
    public R add(AddNewupTaskReq req, String creator, String createNo){
        boolean billNoCheckFlag = (null != req.getId() && req.getTaskno().equals(req.getNewtaskno()));
        if(!billNoCheckFlag){
            //单号做唯一校验
            boolean billNoFlag = checkRepeatBillNo(req.getTaskno());
            if(!billNoFlag){
                return R.buildError(ResultStatusEnum.BILL_NO_REPEAT);
            }
        }
        //第一步：主表新增、修改
        Integer id = addOrUpdate(req, creator, createNo);
        if(null == id){
            return R.buildError(ResultStatusEnum.SYSTEM_ERROR);
        }

        //第二步：资源样品明细新增以及更新资源样品明细数量
        insertDetail(req, id, creator, createNo);

        return R.build(ResultStatusEnum.SUCCESS);
    }

    /**
     * 明细新增
     * @param req 入参
     * @param id 出库id
     * @param creator 创建人
     * @param createNo 创建人编码
     */
    public void insertDetail(AddNewupTaskReq req, Integer id, String creator, String createNo){
        if(!CollectionUtils.isEmpty(req.getDetails())){
            //获取修改明细id集合
            List<Integer> newIds = new ArrayList<>();
            //新增明细集合
            List<TaskProductInfo> addDetails = new ArrayList<>();
            for(AddProductionReq detailReq : req.getDetails()){
                //资源样品明细对象
                TaskProductInfo detail = new TaskProductInfo();

                //赋值
                BeanUtils.copyProperties(detailReq, detail);
                //设置id
                detail.setTaskid(id);
                //创建时间
                detail.setCreatetime(new Date());

                if(null == detailReq.getTaskid()){
                    //新增
                    addDetails.add(detail);
                }else {
                    //修改
                    //获取明细id
                    newIds.add(detailReq.getProductid());
                    detail.setEdittime(new Date());
                    taskProductInfoService.update(detail);
                }

            }

            //处理被删除的资源样品明细
      //      handleBeenDeletedTransferDetail(req, id, newIds);

            if(!CollectionUtils.isEmpty(addDetails)){
                //调用接口保存资源样品明细
                taskProductInfoService.addList(addDetails);
            }
        }
    }

    /**
     * 校验单号是否存在
     * @param billNo 单号
     * @return true:不重复 false:重复
     */
    private boolean checkRepeatBillNo(String billNo){
        TaskInfo taskid = new TaskInfo();
        taskid.setTaskno(billNo);
        List<TaskInfo> list = taskInfoService.queryAll(taskid);
        if(CollectionUtils.isEmpty(list)){
            return true;
        }
        return false;
    }

    /**
     * 新增、修改
     * @param req 参数实体
     * @param creator 创建人
     * @param createNo 创建人编码
     * @return 新增、修改结果
     */
    private Integer addOrUpdate(AddNewupTaskReq req, String creator, String createNo){
        //初始化对象
        TaskInfo data = new TaskInfo();
        //赋值
        BeanUtils.copyProperties(req, data);
        //设置创建人
        data.setCreatetime(new Date());

        //设置状态,默认为草稿箱
        data.setStatus(OperationStatusEnum.DRAFT_BOX.getId());

        if(null == req.getId()){
            //新增
            //创建日期
            data.setCreatetime(new Date());

            //调用接口新增
            taskInfoService.insert(data);
        }else {
            //修改
            taskInfoService.update(data);
        }
        return data.getId();
    }
}
